package com.bbva.itradecomex.controller;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.event.ComponentSystemEvent;

import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.jsf.FacesContextUtils;
import com.bbva.itradecomex.bo.iface.MedioDePagoBO;
import com.bbva.itradecomex.controller.login.AccesoController;
import com.bbva.itradecomex.domain.MediosDePagoDetalle;
import com.bbva.itradecomex.domain.MedioDePagoResumen;
import com.bbva.itradecomex.domain.MedioDePagoResumenTotal;
import com.bbva.itradecomex.domain.ProductoBaseMT;
import com.bbva.itradecomex.domain.Usuario;
import com.bbva.itradecomex.form.MedioDePagoForm;
import com.bbva.itradecomex.util.Constantes;
import com.bbva.itradecomex.util.ITradexUtil;
import com.bbva.itradecomex.util.MessageProvider;

@Controller
@RequestScoped
@ManagedBean
public class MedioDePagoController {
	
	private static final Logger log = Logger.getLogger(MedioDePagoController.class);
	
	@Autowired
	private MedioDePagoBO medioDePagoBO;
	
	private MedioDePagoForm medioDePagoForm;

	private List<MediosDePagoDetalle> listMedioDePagoDetalle;
	private List<MedioDePagoResumen> listMedioDePagoResumenImp;
	private List<MedioDePagoResumen> listMedioDePagoResumenExp;
	private List<MedioDePagoResumenTotal> listMedioDePagoResumenImpExp;
	
	private MedioDePagoResumenTotal footerImp;
	private MedioDePagoResumenTotal footerExp;
	private MedioDePagoResumenTotal footerImpExp;
	
	private boolean buscar;
	
	public void onPageLoad(ComponentSystemEvent event) {
		try {
			if (!FacesContext.getCurrentInstance().isPostback()) {
				AccesoController accesoController = (AccesoController)FacesContextUtils.getWebApplicationContext(FacesContext.
						getCurrentInstance()).getBean("AccesoController");				
				
				inicializarValores();
				buscar = true;
				medioDePagoForm = new MedioDePagoForm();
				Calendar cal = Calendar.getInstance();
				cal.set(Calendar.YEAR, cal.get(Calendar.YEAR));
				cal.set(Calendar.MONTH, 0);
				cal.set(Calendar.DAY_OF_MONTH, 1);
				medioDePagoForm.setInFechadesde(cal.getTime());
				medioDePagoForm.setInFechahasta(Calendar.getInstance().getTime());

				ComunController comunController = (ComunController)FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance())
						.getBean("comunController");
				comunController.inicializarValores();
				comunController.cargarListTipoDocumento();
				comunController.cargarExclusividadBancos();
				comunController.cargarExclusividadAladi();
				comunController.cargarListProductoMT();
				
				buscarMediodePagoAction();
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}
                            
	public void validateDateChange(AjaxBehaviorEvent event){
		if(ITradexUtil.esFecha1MayorFecha2(medioDePagoForm.getInFechadesde(), medioDePagoForm.getInFechahasta())){
			buscar = false;
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
		}else{
			buscar = true;
		}
	}
	
	public void validateDateDateSelect(DateSelectEvent event){
		if(ITradexUtil.esFecha1MayorFecha2(medioDePagoForm.getInFechadesde(), medioDePagoForm.getInFechahasta())){
			buscar = false;
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
		}else{
			buscar = true;
		}
	}
	
	public void validateRangoMonto(AjaxBehaviorEvent event){
		BigDecimal bg1 = medioDePagoForm.getInMontodesde();
		BigDecimal bg2 = medioDePagoForm.getInMontohasta();

		if(Constantes.VALOR_CERO.equals(String.valueOf(bg1)) || Constantes.VALOR_CERO.equals(String.valueOf(bg2))){
			if(Constantes.VALOR_CERO.equals(String.valueOf(bg1))){
				medioDePagoForm.setInMontodesde(null);
			}else{
				medioDePagoForm.setInMontohasta(null);
			}	
		}else if(bg1 != null && bg2 != null){
			if(bg1.compareTo(bg2) == 1){
				buscar = false;
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
						MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_MONTO"),
						MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_MONTO")));
			}else{
				buscar = true;
			}
		}
	}

	public void buscarMediodePagoAction(){
		if(buscar){
			try {
				inicializarValores();
				
				ComunController comunController = (ComunController)FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance())
						.getBean("comunController");
				String codPais = "";
				String descPais = "";
				String codBanco = "";
				String descBanco = "";
				String codMoneda = "";
				String descMoneda = "";
				String codTipoDocumento = "";
				String descTipoDocumento = "";
				String codExclusivBanco = "";
				String descExclusivBanco = "";
				String codExclusivAladi = "";
				String descExclusivAladi = "";
				String arrayCodProdSeleccionado = "";
				String arrayDescProductoMT = "";
				String arrayCodSubProdSeleccionado = "";
				String arrayDescSubProductoMT = "";
				String codExclusivOper = "";
				String descExclusivOper = "";
				
				if(comunController.getTipoDocSeleccionado() != null){
					if(comunController.getTipoDocSeleccionado().getCodTipoDocumento() != null){
						codTipoDocumento = comunController.getTipoDocSeleccionado().getCodTipoDocumento();
					}
					if(comunController.getTipoDocSeleccionado().getDescripcion() != null){
						descTipoDocumento = comunController.getTipoDocSeleccionado().getDescripcion();
					}
				}
				
				if(comunController.getPaisSeleccionado() != null){
					if(comunController.getPaisSeleccionado().getCodPais() != null){
						codPais = comunController.getPaisSeleccionado().getCodPais();
					}
					if(comunController.getPaisSeleccionado().getDescripcion() != null){
						descPais = comunController.getPaisSeleccionado().getDescripcion();
					}
				}
				
				if(comunController.getBancoSeleccionado() != null){
					if(comunController.getBancoSeleccionado().getCodBanco() != null){
						codBanco = comunController.getBancoSeleccionado().getCodBanco();	
					}
					if(comunController.getBancoSeleccionado().getDescBanco1() != null){
						descBanco = comunController.getBancoSeleccionado().getDescBanco1();
					}
				}
						
				if(comunController.getExclusivBancoSeleccionado() != null){
					if(comunController.getExclusivBancoSeleccionado().getValor1() != null){
						codExclusivBanco = comunController.getExclusivBancoSeleccionado().getValor1();	
					}
					if(comunController.getExclusivBancoSeleccionado().getDescripcion() != null){
						descExclusivBanco = comunController.getExclusivBancoSeleccionado().getDescripcion();	
					}
				}
				
				if(comunController.getExclusivAladiSeleccionado() != null){
					if(comunController.getExclusivAladiSeleccionado().getValor1() != null){
						codExclusivAladi = comunController.getExclusivAladiSeleccionado().getValor1();	
					}
					if(comunController.getExclusivAladiSeleccionado().getDescripcion() != null){
						descExclusivAladi = comunController.getExclusivAladiSeleccionado().getDescripcion();	
					}
				}
				
				if(comunController.getMonedaSeleccionado() != null){
					if(comunController.getMonedaSeleccionado().getCodMoneda() != null){
						codMoneda = comunController.getMonedaSeleccionado().getCodMoneda();
					}
					if(comunController.getMonedaSeleccionado().getDescripcion() != null){
						descMoneda = comunController.getMonedaSeleccionado().getDescripcion();	
					}
				}
				
				if(comunController.getListProductoMTSeleccionado() != null && comunController.getListProductoMTSeleccionado().size() > 0){
					List<ProductoBaseMT> listProductoMT = comunController.getListProductoMTSeleccionado();
					arrayCodProdSeleccionado = comunController.getArrayCodigo(listProductoMT, Constantes.COMA, true);
					arrayDescProductoMT = comunController.getArrayCodigo(listProductoMT, Constantes.TAB, false);
				}
				
				if(comunController.getListSubProductoMTSeleccionado() != null && comunController.getListSubProductoMTSeleccionado().size() > 0){
					List<ProductoBaseMT> listSubProductoMT = comunController.getListSubProductoMTSeleccionado();
					arrayCodSubProdSeleccionado = comunController.getArrayCodigo(listSubProductoMT, Constantes.COMA, true);
					arrayDescSubProductoMT = comunController.getArrayCodigo(listSubProductoMT, Constantes.TAB, false);
				}
				
				if(comunController.getExclusivOperSeleccionado() != null){
					if(comunController.getExclusivOperSeleccionado().getValor1() != null){
						codExclusivOper = comunController.getExclusivOperSeleccionado().getValor1();	
					}
					if(comunController.getExclusivOperSeleccionado().getDescripcion() != null){
						descExclusivOper = comunController.getExclusivOperSeleccionado().getDescripcion();	
					}
				}
	
				medioDePagoForm.setInBuscarcliente(codTipoDocumento);
				medioDePagoForm.setInCodPais(codPais);
				medioDePagoForm.setInCodBco(codBanco);
				medioDePagoForm.setInCodProductoMT(arrayCodProdSeleccionado);
				medioDePagoForm.setInCodSubProductoMT(arrayCodSubProdSeleccionado);
				medioDePagoForm.setInExclusividadOper(codExclusivOper);
				medioDePagoForm.setInExclusividadBco(codExclusivBanco);
				medioDePagoForm.setInExclusividadAladi(codExclusivAladi);
				medioDePagoForm.setInCodMoneda(codMoneda);
				
				medioDePagoForm.setDescInBuscarcliente(descTipoDocumento);
				medioDePagoForm.setDescInCodPais(descPais);
				medioDePagoForm.setDescInCodBco(descBanco);
				medioDePagoForm.setDescInExclusividadBco(descExclusivBanco);
				medioDePagoForm.setDescInExclusividadAladi(descExclusivAladi);
				medioDePagoForm.setDescInCodMoneda(descMoneda);
				medioDePagoForm.setDescInCodProductoMT(arrayDescProductoMT);
				medioDePagoForm.setDescInCodSubProductoMT(arrayDescSubProductoMT);
				medioDePagoForm.setDescInExclusividadOper(descExclusivOper);

				cargarResumen();
				
				listMedioDePagoDetalle = medioDePagoBO.getListMedioDePagoDetalle(medioDePagoForm);
	
			} catch (Exception e) {
				e.printStackTrace();
				log.error(e.getMessage(),e);
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
						MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
						MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
			}
		}else{
			log.error("Error en el formulario");
		}
	}
	
	private void cargarResumen(){
		try {
			List list = medioDePagoBO.getListMedioDePagoResumen(medioDePagoForm);
			listMedioDePagoResumenImp = (List<MedioDePagoResumen>)list.get(0);
			listMedioDePagoResumenExp = (List<MedioDePagoResumen>)list.get(1);
			listMedioDePagoResumenImpExp =  (List<MedioDePagoResumenTotal>)list.get(2);
			
			medioDePagoBO.setFooter(listMedioDePagoResumenImp, footerImp);
			medioDePagoBO.setFooter(listMedioDePagoResumenExp, footerExp);
			medioDePagoBO.setFooterTotal(listMedioDePagoResumenImpExp, footerImpExp);
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}
	
	public void exportDocument(String tipoDoc){
		if((listMedioDePagoResumenImp != null && listMedioDePagoResumenImp.size() > 0) ||
		   (listMedioDePagoResumenExp != null && listMedioDePagoResumenExp.size() > 0) ||
		   (listMedioDePagoDetalle != null && listMedioDePagoDetalle.size() > 0))
		{
			Map<String,Object> parametros = new HashMap<String, Object>();
			parametros.put("listResuImp",listMedioDePagoResumenImp);
			parametros.put("listResuExp",listMedioDePagoResumenExp);
			parametros.put("listResuImpExp",listMedioDePagoResumenImpExp);
			parametros.put("listDetalle",listMedioDePagoDetalle);
			parametros.put("obFooterImp",footerImp);
			parametros.put("obFooterExp",footerExp);
			parametros.put("obFooterImpExp",footerImpExp);
			parametros.put("obForm",medioDePagoForm);
			Date mydate = new Date();
			parametros.put("dateReport", mydate);
			
			String nombreFile = "MEDIOS_PAGO_"+ITradexUtil.convertUtilDateToString(mydate, Constantes.FORMAT_DATE_MM_DD_yyyy);
			
			if(Constantes.ARCHIVO_EXCEL.equals(tipoDoc)){
				ITradexUtil.exportXLSJasperEmptyDS(parametros, "/xmlReport/MediosDePago/MDPmain_excel.jasper", nombreFile);
			}else if(Constantes.ARCHIVO_PDF.equals(tipoDoc)){
				ITradexUtil.exportPDFEmptyDS(parametros, "/xmlReport/MediosDePago/MDPmain.jasper", nombreFile);
			}
		}
	}
	
	private void inicializarValores(){
		listMedioDePagoDetalle = null;
		listMedioDePagoResumenImp = null;
		listMedioDePagoResumenExp = null;
		listMedioDePagoResumenImpExp = null;
		footerImp = new MedioDePagoResumenTotal();
		footerExp = new MedioDePagoResumenTotal();
		footerImpExp = new MedioDePagoResumenTotal();
	}
	
	public List<MediosDePagoDetalle> getListMedioDePagoDetalle() {
		return listMedioDePagoDetalle;
	}

	public List<MedioDePagoResumen> getListMedioDePagoResumenImp() {
		return listMedioDePagoResumenImp;
	}
	
	public List<MedioDePagoResumen> getListMedioDePagoResumenExp() {		
		return listMedioDePagoResumenExp;
	}

	public List<MedioDePagoResumenTotal> getListMedioDePagoResumenImpExp() {
		return listMedioDePagoResumenImpExp;
	}

	public MedioDePagoForm getMedioDePagoForm() {
		return medioDePagoForm;
	}

	public void setMedioDePagoForm(MedioDePagoForm medioDePagoForm) {
		this.medioDePagoForm = medioDePagoForm;
	}

	public MedioDePagoResumenTotal getFooterImp() {
		return footerImp;
	}

	public void setFooterImp(MedioDePagoResumenTotal footerImp) {
		this.footerImp = footerImp;
	}

	public MedioDePagoResumenTotal getFooterExp() {
		return footerExp;
	}

	public void setFooterExp(MedioDePagoResumenTotal footerExp) {
		this.footerExp = footerExp;
	}

	public MedioDePagoResumenTotal getFooterImpExp() {
		return footerImpExp;
	}

	public void setFooterImpExp(MedioDePagoResumenTotal footerImpExp) {
		this.footerImpExp = footerImpExp;
	}
}
